import numpy as np

class Dataset:
    def __init__(self, train: bool = True, transform=None, target_transform=None):
        """
        初始化数据集。

        Args:
            train (bool, optional): 是否为训练数据集。默认为True。
            transform (optional): 数据转换函数。默认为None。
            target_transform (optional): 目标数据转换函数。默认为None。
        """
        self.train = train
        self.transform = transform if transform is not None else lambda x: x
        self.target_transform = target_transform if target_transform is not None else lambda x: x

        self.data = None
        self.label = None

        self.prepare()

    def __getitem__(self, index):
        '''
        __getitem__ 方法是Python中一个特殊的方法，用于定义对象的索引操作行为。当你的对象（类的实例）出现在索引表达式中时（例如 obj[index]），
        Python 会自动调用该对象的 __getitem__ 方法。这个方法允许你定义自己的类的实例能够被索引，就像列表、字典等内置的数据结构一样。

        在上下文中，如果你有一个自定义的数据集类，实现了 __getitem__ 方法，你就能够像处理列表一样处理这个数据集。例如，如果 dataset
        是你的数据集对象，你可以使用 dataset[index] 来获取数据集中的元素。通常，这个方法会返回数据集中特定索引位置的数据项，以便在训练模型时使用。

        '''
        # np.isscalar(obj) 用于判断给定的对象 obj 是否是标量（scalar）
        assert np.isscalar(index)
        data_item = self.transform(self.data[index])
        label_item = None if self.label is None else self.target_transform(self.label[index])
        return data_item, label_item

    def __len__(self):
        """
        获取数据集的长度。

        Returns:
            int: 数据集的长度。
        """
        return len(self.data)

    def prepare(self):
        pass



